﻿// Cleaning Shifts POJ - 2376.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>


using namespace std;
//https://vjudge.csgrandeur.cn/problem/POJ-2376
/*
农场主约翰要安排他的N 1 <= N <= 25,000 头奶牛在谷仓周围进行一些清洁工作。他希望始终有一头奶牛负责清理，
并将一天分为T个班次（1 <= T <= 1,000,000），第一个班次为1，最后一个班次为T。

每头奶牛在一天中的某个时间段内可以进行清洁工作。任何被选中进行清洁任务的奶牛都会在她的时间段内全程工作。

你的任务是帮助约翰农场主分配一些奶牛到班次，以满足以下条件：
（i）每个班次至少有一头奶牛分配到；
（ii）尽可能少的奶牛参与清洁工作。如果无法为每个班次分配奶牛，则输出-1。

输入
第1行：两个用空格分隔的整数：N和T
第2行到第N+1行：每行包含一头奶牛可工作的起始时间和结束时间。奶牛从起始时间开始工作，在结束时间后完成工作。

输出
第1行：农场主约翰需要雇佣的最少奶牛数量，如果无法为每个班次分配奶牛，则输出-1。
示例

3 10
1 7
3 6
6 10


2

提示
这个问题的输入数据非常庞大，使用scanf()而不是cin来读取数据以避免超时。

输入详情：
有3头奶牛和10个班次。奶牛1可以在班次1到7工作，奶牛2可以在班次3到6工作，奶牛3可以在班次6到10工作。

输出详情：
通过选择奶牛1和奶牛3，所有班次都得到了覆盖。使用少于2头奶牛无法完成所有班次的分配。
*/

const int N = 25010;
struct SEG {
	int l, r;
}seg[N];

int n, t;

void solve() {
	int curr = 0; int next = 0;
	int ans = 0; 

	if(seg[1].l >1){ cout << -1 << endl; return; }

	for (int i = 1; i <= n; i++) {
		if (seg[i].l > curr+1 && seg[i].l > next+1) break;

		if (seg[i].l <= curr+1 ) {
			next = max(next, seg[i].r);
			if (next >= t) {
				ans++; break;
			}
		}
		else if (seg[i].l > curr+1) {
			curr = next; ans++; i--;
			if (next >= t) break;
		}
	}
	if (next < t) {
		cout << -1 << endl; return;
	}

	cout << ans << endl;
}

bool cmp(const struct SEG& a, const struct SEG& b) {
	if (a.l < b.l) return true;
	else if (a.l == b.l) {
		return a.r > b.r;
	}

	return false;
}

int main()
{
	cin >> n >> t;
	for (int i = 1; i <= n; i++) {
		cin >> seg[i].l >> seg[i].r;
	}
	sort(seg+1, seg+1+n,cmp);
	solve();

	return 0;
}

 